/****************************************************************************
 * Copyright (C) 2010
 * by Dimok
 *
 * This software is provided 'as-is', without any express or implied
 * warranty. In no event will the authors be held liable for any
 * damages arising from the use of this software.
 *
 * Permission is granted to anyone to use this software for any
 * purpose, including commercial applications, and to alter it and
 * redistribute it freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you
 * must not claim that you wrote the original software. If you use
 * this software in a product, an acknowledgment in the product
 * documentation would be appreciated but is not required.
 *
 * 2. Altered source versions must be plainly marked as such, and
 * must not be misrepresented as being the original software.
 *
 * 3. This notice may not be removed or altered from any source
 * distribution.
 *
 * for WiiXplorer 2010
 ***************************************************************************/
#ifndef DEVICE_HANDLER_HPP_
#define DEVICE_HANDLER_HPP_

#include "PartitionHandle.h"

enum
{
    SD = 0,
    USB1,
    USB2,
    USB3,
    USB4,
    USB5,
    USB6,
    USB7,
    USB8,
    MAXDEVICES
};

const char DeviceName[MAXDEVICES][6] =
{
    "sd",
    "usb1",
    "usb2",
    "usb3",
    "usb4",
    "usb5",
    "usb6",
    "usb7",
    "usb8",
};

class DeviceHandler
{
    public:
		static DeviceHandler * Instance();
		static void DestroyInstance();

        bool MountAll();
        void UnMountAll();
        bool Mount(int dev);
        bool IsInserted(int dev);
        void UnMount(int dev);

        //! Individual Mounts/UnMounts...
		bool MountSD();
		bool MountAllUSB();
		bool MountUSB(int part);
		bool SD_Inserted() { if(sd) return sd->IsInserted(); return false; };
		bool USB_Inserted() { if(usb) return usb->IsInserted(); return false; };
		void UnMountSD() { if(sd) delete sd; sd = NULL; };
		void UnMountUSB(int pos);
		void UnMountAllUSB();
		const PartitionHandle * GetSDHandle() { return sd; };
		const PartitionHandle * GetUSBHandle() { return usb; };
		static int PathToDriveType(const char * path);
        static const char * GetFSName(int dev);
        static const char * PathToFSName(const char * path) { return GetFSName(PathToDriveType(path)); };
    private:
        DeviceHandler() : sd(0), usb(0) { };
        ~DeviceHandler();

		static DeviceHandler *instance;

        PartitionHandle * sd;
        PartitionHandle * usb;
};

#endif
